/*
* Copyright (c) 2016.2，华乘电气科技有限公司
* All rights reserved.
*
* 文件名称：BlowFishCrypto.h
*
* 初始版本：1.0
* 作者：
* 创建日期：2016年2月26日
* 摘要：该文件主要是定义基于BlowFish的加密模块
*
*/
#ifndef _BLOWFISHCRYPTO_H
#define _BLOWFISHCRYPTO_H
#include <QtCore>

#define MAX_KEY_SIZE 56
#define MAX_PBLOCK_SIZE 18
#define MAX_SBLOCK_XSIZE 4
#define MAX_SBLOCK_YSIZE 256

#include "crypto_global.h"
/*Block Structure*/
typedef struct
{
    unsigned int m_uil; /*Hi*/
    unsigned int m_uir; /*Lo*/
}SBlock;
typedef struct
{
    SBlock m_oChain;
    unsigned int m_auiP[MAX_PBLOCK_SIZE];
    unsigned int m_auiS[MAX_SBLOCK_XSIZE][MAX_SBLOCK_YSIZE];
}Blowfish;
class BlowFishCrypto
{
public:
    typedef enum _CryptoMode
    {
        ECB = 0,
        CBC,
        CFB
    }CryptoMode;

    /************************************************
     * 函数名    :BlowFishCrypto
     * 输入参数  ：
     *      baKey -- 密钥
     *      mode -- 算法
     * 输出参数  ：NULL
     * 返回值   ：NULL
     * 功能     ：构造函数
     ************************************************/
    BlowFishCrypto( const QByteArray& baKey, CryptoMode mode = ECB );

    /************************************************
     * 函数名    :~DesCrypto
     * 输入参数  ：void
     * 输出参数  ：NULL
     * 返回值   ：NULL
     * 功能     ：析构函数
     ************************************************/
    ~BlowFishCrypto(){};

    /************************************************
     * 函数名    :enCrypt
     * 输入参数  ：
     *      data -- 需要加密的数据
     * 输出参数  ：NULL
     * 返回值   ：
     *      加密后的数据
     * 功能     ：加密
     ************************************************/
    QByteArray enCrypt( const QByteArray& data );

    /************************************************
     * 函数名    :deCrypt
     * 输入参数  ：
     *      data -- 需要解密的数据
     * 输出参数  ：NULL
     * 返回值   ：
     *      解密后的数据
     * 功能     ：解密
     ************************************************/
    QByteArray deCrypt( const QByteArray& data );
private:
    /************************************************
     * 函数名    :enCryptData
     * 输入参数  ：
     *      data -- 需要加密的数据
     * 输出参数  ：NULL
     * 返回值   ：
     *      加密后的数据
     * 功能     ：加密
     ************************************************/
    QByteArray enCryptData( const QByteArray& data );
    int EncryptByte(Blowfish *blowfish, const unsigned char *bin, size_t n, unsigned char *bout, int iMode);
    int DecryptByte(Blowfish *blowfish, const unsigned char *bin, size_t n, unsigned char *bout, int iMode);
private:
    QByteArray m_baKey;
    Blowfish m_data;
    CryptoMode m_mode;
};

#endif /*__BLOWFISH_H__*/
